﻿using System;
using System.Linq;
using System.Collections.Generic;
using PSE.Tools.Util.ExtensoesMetodos;
using PSE.Tools.Util.AcessoDados;
using System.Text;
using System.Data;

namespace PSE.Tools.CadastroMensagens.AcessoDados
{
    /// <summary>
    /// Classe que persiste as informações de Perfis
    /// </summary>
    public class Perfil : ResourceAccess
    {
        #region [ Métodos ]

        /// <summary>
        /// Insere um Perfil no banco de dados
        /// </summary>
        /// <param name="entidade">Resource a ser inserido</param>
        public void Inserir(Entidades.Perfil entidade)
        {
            StringBuilder sql = new StringBuilder();

            entidade.Id = this.GetNextId("TFWDPERFIL", "COD_PERFIL");

            sql.Append(@"
            INSERT INTO 
                TFWDPERFIL
                (
                    COD_PERFIL,
	                TXT_PERFIL,
	                COD_USUA_PERFIL,
	                COD_USUA_CRIA,
	                DATA_HORA_CRIA,
	                COD_USUA_ATLZ,
	                DATA_HORA_ATLZ
                )
                VALUES
                (
                    :COD_PERFIL, 
                    :TXT_PERFIL,
                    :COD_USUA_PERFIL, 
                    :COD_USUA_CRIA,
                    :DATA_HORA_CRIA, 
                    :COD_USUA_ATLZ,
                    :DATA_HORA_ATLZ
                )
            ");

            using (IDbCommand command = this.GetSqlStringCommand(sql.ToString()))
            {
                this.AddInParameter(command, "COD_PERFIL", DbType.Int32, entidade.Id);
                this.AddInParameter(command, "TXT_PERFIL", DbType.String, entidade.PerfilSalvo);
                this.AddInParameter(command, "COD_USUA_PERFIL", DbType.Int32, entidade.UsuarioPerfil);
                this.AddInParameter(command, "COD_USUA_CRIA", DbType.Int32, entidade.IdCriadoPor);
                this.AddInParameter(command, "DATA_HORA_CRIA", DbType.DateTime, entidade.CriadoEm);
                this.AddInParameter(command, "COD_USUA_ATLZ", DbType.Int32, entidade.IdAtualizadoPor);
                this.AddInParameter(command, "DATA_HORA_ATLZ", DbType.DateTime, entidade.AtualizadoEm);
                this.ExecuteNonQuery(command);
            }
        }

        /// <summary>
        /// Retorna uma lista de Perfis
        /// </summary>
        public IList<Entidades.Perfil> Listar(int idUsuario)
        {
            StringBuilder sql = new StringBuilder();

            sql.Append(@"
            SELECT DISTINCT
	            TXT_PERFIL
            FROM 
                TFWDPERFIL 
            WHERE 
                ROWNUM < 5 AND
                COD_USUA_CRIA = :COD_USUA_CRIA
            GROUP BY 
                TXT_PERFIL
            ");

//            sql.Append(@"
//            SELECT DISTINCT
//                COD_PERFIL,
//	            TXT_PERFIL,
//	            COD_USUA_PERFIL,
//	            COD_USUA_CRIA,
//	            DATA_HORA_CRIA,
//	            COD_USUA_ATLZ,
//	            DATA_HORA_ATLZ
//            FROM 
//                TFWDPERFIL 
//            WHERE 
//                ROWNUM < 5 AND
//                COD_USUA_CRIA = :COD_USUA_CRIA
//            ORDER BY 
//                DATA_HORA_CRIA DESC
//            ");

            IList<Entidades.Perfil> perfis;

            using (IDbCommand command = this.GetSqlStringCommand(sql.ToString()))
            {
                this.AddInParameter(command, "COD_USUA_CRIA", DbType.Int32, idUsuario);
                perfis = this.FindAll<Entidades.Perfil>(command,
                    i => new Entidades.Perfil()
                    {
                        //Id = i.GetValue<int>("COD_PERFIL"),
                        PerfilSalvo = i.GetValue<string>("TXT_PERFIL")
                        //UsuarioPerfil = i.GetValue<int>("COD_USUA_PERFIL"),
                        //IdCriadoPor = i.GetValue<int>("COD_USUA_CRIA"),
                        //CriadoEm = i.GetValue<DateTime>("DATA_HORA_CRIA"),
                        //IdAtualizadoPor = i.GetValue<int>("COD_USUA_ATLZ"),
                        //AtualizadoEm = i.GetValue<DateTime>("DATA_HORA_ATLZ")
                    }
                );
            }
            return perfis;
        }

        /// <summary>
        /// Retorna o Último Perfil Salvo do Usuário
        /// </summary>
        public Entidades.Perfil Selecionar(Entidades.Perfil entidade)
        {
            StringBuilder sql = new StringBuilder();

            sql.Append(@"
            SELECT 
                COD_PERFIL,
	            TXT_PERFIL,
	            COD_USUA_PERFIL,
	            COD_USUA_CRIA,
	            DATA_HORA_CRIA,
	            COD_USUA_ATLZ,
	            DATA_HORA_ATLZ
            FROM 
                TFWDPERFIL 
            WHERE 
                COD_USUA_PERFIL = :COD_USUA_PERFIL AND
                MAX(DATA_HORA_CRIA)
            ");

            Entidades.Perfil perfil;

            using (IDbCommand command = this.GetSqlStringCommand(sql.ToString()))
            {
                this.AddInParameter(command, "COD_USUA_PERFIL", DbType.String, entidade.UsuarioPerfil);

                perfil = this.FindOne<Entidades.Perfil>(command,
                    i => new Entidades.Perfil()
                    {
                        Id = i.GetValue<int>("COD_PERFIL"),
                        PerfilSalvo = i.GetValue<string>("TXT_PERFIL"),
                        UsuarioPerfil = i.GetValue<int>("COD_USUA_PERFIL"),
                        IdCriadoPor = i.GetValue<int>("COD_USUA_CRIA"),
                        CriadoEm = i.GetValue<DateTime>("DATA_HORA_CRIA"),
                        IdAtualizadoPor = i.GetValue<int>("COD_USUA_ATLZ"),
                        AtualizadoEm = i.GetValue<DateTime>("DATA_HORA_ATLZ")
                    }
                );
            }
            return perfil;
        }

        #endregion [ Métodos ]
    }
}
